{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a4773db",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Execute this cell to install dependencies\n",
    "%pip install sf-hamilton[visualization] pandas polars narwhals"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1222755",
   "metadata": {},
   "source": [
    "# run me in google colab [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/dagworks-inc/hamilton/blob/main/examples/narwhals/notebook.ipynb) [![GitHub badge](https://img.shields.io/badge/github-view_source-2b3137?logo=github)](https://github.com/apache/hamilton/blob/main/examples/narwhals/notebook.ipynb)\n",
    "\n",
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/dagworks-inc/hamilton/blob/main/narwhals/notebook.ipynb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "39c8b25f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-01T19:02:16.560492Z",
     "start_time": "2024-07-01T19:02:06.001758Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cannot import name 'PolarsDataType' from 'polars' (/Users/stefankrawczyk/.pyenv/versions/knowledge_retrieval-py39/lib/python3.9/site-packages/polars/__init__.py)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/stefankrawczyk/.pyenv/versions/knowledge_retrieval-py39/lib/python3.9/site-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "%load_ext hamilton.plugins.jupyter_magic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e0df9e60",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-01T19:04:42.572389Z",
     "start_time": "2024-07-01T19:04:42.567211Z"
    }
   },
   "outputs": [],
   "source": [
    "config = {\n",
    "    \"mode\": \"pandas\"\n",
    "}\n",
    "from hamilton import driver\n",
    "builder = driver.Builder()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "21d2a689",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-01T19:06:01.729149Z",
     "start_time": "2024-07-01T19:06:01.052739Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 10.0.1 (20240210.2158)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"326pt\" height=\"374pt\"\n",
       " viewBox=\"0.00 0.00 326.20 374.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 370)\">\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-370 322.2,-370 322.2,4 -4,4\"/>\n",
       "<g id=\"clust1\" class=\"cluster\">\n",
       "<title>cluster__legend</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" points=\"38.88,-228 38.88,-358 123.73,-358 123.73,-228 38.88,-228\"/>\n",
       "<text text-anchor=\"middle\" x=\"81.3\" y=\"-340.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Legend</text>\n",
       "</g>\n",
       "<!-- mode -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>mode</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" points=\"105.43,-50 51.18,-50 51.18,0 111.43,0 111.43,-44 105.43,-50\"/>\n",
       "<polyline fill=\"none\" stroke=\"black\" points=\"105.43,-50 105.43,-44\"/>\n",
       "<polyline fill=\"none\" stroke=\"black\" points=\"111.43,-44 105.43,-44\"/>\n",
       "<text text-anchor=\"start\" x=\"62.93\" y=\"-33.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">mode</text>\n",
       "<text text-anchor=\"start\" x=\"59.18\" y=\"-5.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">pandas</text>\n",
       "</g>\n",
       "<!-- group_by_mean -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>group_by_mean</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M306.2,-121.8C306.2,-121.8 203.6,-121.8 203.6,-121.8 197.6,-121.8 191.6,-115.8 191.6,-109.8 191.6,-109.8 191.6,-70.2 191.6,-70.2 191.6,-64.2 197.6,-58.2 203.6,-58.2 203.6,-58.2 306.2,-58.2 306.2,-58.2 312.2,-58.2 318.2,-64.2 318.2,-70.2 318.2,-70.2 318.2,-109.8 318.2,-109.8 318.2,-115.8 312.2,-121.8 306.2,-121.8\"/>\n",
       "<text text-anchor=\"start\" x=\"202.4\" y=\"-98.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">group_by_mean</text>\n",
       "<text text-anchor=\"start\" x=\"220.77\" y=\"-70.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- example1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>example1</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M284.82,-205.8C284.82,-205.8 224.97,-205.8 224.97,-205.8 218.97,-205.8 212.97,-199.8 212.97,-193.8 212.97,-193.8 212.97,-154.2 212.97,-154.2 212.97,-148.2 218.97,-142.2 224.97,-142.2 224.97,-142.2 284.82,-142.2 284.82,-142.2 290.82,-142.2 296.82,-148.2 296.82,-154.2 296.82,-154.2 296.82,-193.8 296.82,-193.8 296.82,-199.8 290.82,-205.8 284.82,-205.8\"/>\n",
       "<text text-anchor=\"start\" x=\"223.77\" y=\"-182.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">example1</text>\n",
       "<text text-anchor=\"start\" x=\"247.77\" y=\"-154.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">int</text>\n",
       "</g>\n",
       "<!-- _group_by_mean_inputs -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>_group_by_mean_inputs</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"138.85,-112.3 23.75,-112.3 23.75,-67.7 138.85,-67.7 138.85,-112.3\"/>\n",
       "<text text-anchor=\"start\" x=\"38.55\" y=\"-84.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">df</text>\n",
       "<text text-anchor=\"start\" x=\"55.8\" y=\"-84.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- _group_by_mean_inputs&#45;&gt;group_by_mean -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_group_by_mean_inputs&#45;&gt;group_by_mean</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M138.96,-90C152.08,-90 166.23,-90 179.97,-90\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"179.86,-93.5 189.86,-90 179.86,-86.5 179.86,-93.5\"/>\n",
       "</g>\n",
       "<!-- _example1_inputs -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>_example1_inputs</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"162.6,-217.3 0,-217.3 0,-130.7 162.6,-130.7 162.6,-217.3\"/>\n",
       "<text text-anchor=\"start\" x=\"26.3\" y=\"-189.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">series</text>\n",
       "<text text-anchor=\"start\" x=\"94.68\" y=\"-189.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Series</text>\n",
       "<text text-anchor=\"start\" x=\"14.68\" y=\"-168.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">col_name</text>\n",
       "<text text-anchor=\"start\" x=\"106.3\" y=\"-168.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">str</text>\n",
       "<text text-anchor=\"start\" x=\"38.68\" y=\"-147.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">df</text>\n",
       "<text text-anchor=\"start\" x=\"79.68\" y=\"-147.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- _example1_inputs&#45;&gt;example1 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>_example1_inputs&#45;&gt;example1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M163.08,-174C176.12,-174 189.32,-174 201.46,-174\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"201.23,-177.5 211.23,-174 201.23,-170.5 201.23,-177.5\"/>\n",
       "</g>\n",
       "<!-- input -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>input</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"108.3,-272.3 54.3,-272.3 54.3,-235.7 108.3,-235.7 108.3,-272.3\"/>\n",
       "<text text-anchor=\"middle\" x=\"81.3\" y=\"-248.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">input</text>\n",
       "</g>\n",
       "<!-- function -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>function</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M103.73,-327.3C103.73,-327.3 58.88,-327.3 58.88,-327.3 52.88,-327.3 46.88,-321.3 46.88,-315.3 46.88,-315.3 46.88,-302.7 46.88,-302.7 46.88,-296.7 52.88,-290.7 58.88,-290.7 58.88,-290.7 103.73,-290.7 103.73,-290.7 109.72,-290.7 115.73,-296.7 115.73,-302.7 115.73,-302.7 115.73,-315.3 115.73,-315.3 115.73,-321.3 109.73,-327.3 103.73,-327.3\"/>\n",
       "<text text-anchor=\"middle\" x=\"81.3\" y=\"-303.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">function</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.graphs.Digraph at 0x1478d0f70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%cell_to_module example --display --config '{\"mode\":\"pandas\"}'\n",
    "\n",
    "import narwhals as nw\n",
    "import pandas as pd\n",
    "import polars as pl\n",
    "\n",
    "from hamilton.function_modifiers import config, tag\n",
    "\n",
    "\n",
    "@config.when(load=\"pandas\")\n",
    "def df__pandas() -> nw.DataFrame:\n",
    "    return pd.DataFrame({\"a\": [1, 1, 2, 2, 3], \"b\": [4, 5, 6, 7, 8]})\n",
    "\n",
    "\n",
    "@config.when(load=\"pandas\")\n",
    "def series__pandas() -> nw.Series:\n",
    "    return pd.Series([1, 3])\n",
    "\n",
    "\n",
    "@config.when(load=\"polars\")\n",
    "def df__polars() -> nw.DataFrame:\n",
    "    return pl.DataFrame({\"a\": [1, 1, 2, 2, 3], \"b\": [4, 5, 6, 7, 8]})\n",
    "\n",
    "\n",
    "@config.when(load=\"polars\")\n",
    "def series__polars() -> nw.Series:\n",
    "    return pl.Series([1, 3])\n",
    "\n",
    "\n",
    "@tag(nw_kwargs=[\"eager_only\"])\n",
    "def example1(df: nw.DataFrame, series: nw.Series, col_name: str) -> int:\n",
    "    return df.filter(nw.col(col_name).is_in(series.to_numpy())).shape[0]\n",
    "\n",
    "\n",
    "def group_by_mean(df: nw.DataFrame) -> nw.DataFrame:\n",
    "    return df.group_by(\"a\").agg(nw.col(\"b\").mean()).sort(\"a\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "947e26fa",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-01T19:08:20.197966Z",
     "start_time": "2024-07-01T19:08:20.151820Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: a single pandas index was found, but there are also 1 outputs without an index. Please check whether the dataframe created matches what what you expect to happen.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>group_by_mean.a</th>\n",
       "      <th>group_by_mean.b</th>\n",
       "      <th>example1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>4.5</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>6.5</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>8.0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   group_by_mean.a  group_by_mean.b  example1\n",
       "0                1              4.5         3\n",
       "1                2              6.5         3\n",
       "2                3              8.0         3"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from hamilton import base, driver\n",
    "from hamilton.plugins import h_narwhals, h_polars\n",
    "# pandas\n",
    "dr = (\n",
    "    driver.Builder()\n",
    "    .with_config({\"load\": \"pandas\"})\n",
    "    .with_modules(example)\n",
    "    .with_adapters(\n",
    "        h_narwhals.NarwhalsAdapter(),\n",
    "        h_narwhals.NarwhalsDataFrameResultBuilder(base.PandasDataFrameResult()),\n",
    "    )\n",
    "    .build()\n",
    ")\n",
    "result = dr.execute([example.group_by_mean, example.example1], inputs={\"col_name\": \"a\"})\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "5b0b0cef",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-01T19:08:25.361471Z",
     "start_time": "2024-07-01T19:08:25.322417Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><style>\n",
       ".dataframe > thead > tr,\n",
       ".dataframe > tbody > tr {\n",
       "  text-align: right;\n",
       "  white-space: pre-wrap;\n",
       "}\n",
       "</style>\n",
       "<small>shape: (3, 2)</small><table border=\"1\" class=\"dataframe\"><thead><tr><th>group_by_mean</th><th>example1</th></tr><tr><td>struct[2]</td><td>i32</td></tr></thead><tbody><tr><td>{1,4.5}</td><td>3</td></tr><tr><td>{2,6.5}</td><td>3</td></tr><tr><td>{3,8.0}</td><td>3</td></tr></tbody></table></div>"
      ],
      "text/plain": [
       "shape: (3, 2)\n",
       "┌───────────────┬──────────┐\n",
       "│ group_by_mean ┆ example1 │\n",
       "│ ---           ┆ ---      │\n",
       "│ struct[2]     ┆ i32      │\n",
       "╞═══════════════╪══════════╡\n",
       "│ {1,4.5}       ┆ 3        │\n",
       "│ {2,6.5}       ┆ 3        │\n",
       "│ {3,8.0}       ┆ 3        │\n",
       "└───────────────┴──────────┘"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# polars\n",
    "dr = (\n",
    "    driver.Builder()\n",
    "    .with_config({\"load\": \"polars\"})\n",
    "    .with_modules(example)\n",
    "    .with_adapters(\n",
    "        h_narwhals.NarwhalsAdapter(),\n",
    "        h_narwhals.NarwhalsDataFrameResultBuilder(h_polars.PolarsDataFrameResult()),\n",
    "    )\n",
    "    .build()\n",
    ")\n",
    "result= dr.execute([example.group_by_mean, example.example1], inputs={\"col_name\": \"a\"})\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "a43db7f6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2024-07-01T19:07:42.534409Z",
     "start_time": "2024-07-01T19:07:41.961806Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 10.0.1 (20240210.2158)\n",
       " -->\n",
       "<!-- Pages: 1 -->\n",
       "<svg width=\"273pt\" height=\"486pt\"\n",
       " viewBox=\"0.00 0.00 273.45 486.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 482)\">\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-482 269.45,-482 269.45,4 -4,4\"/>\n",
       "<g id=\"clust1\" class=\"cluster\">\n",
       "<title>cluster__legend</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" points=\"12.5,-286 12.5,-470 97.35,-470 97.35,-286 12.5,-286\"/>\n",
       "<text text-anchor=\"middle\" x=\"54.93\" y=\"-452.7\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">Legend</text>\n",
       "</g>\n",
       "<!-- load -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>load</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" points=\"75.93,-50 27.93,-50 27.93,0 81.93,0 81.93,-44 75.93,-50\"/>\n",
       "<polyline fill=\"none\" stroke=\"black\" points=\"75.93,-50 75.93,-44\"/>\n",
       "<polyline fill=\"none\" stroke=\"black\" points=\"81.93,-44 75.93,-44\"/>\n",
       "<text text-anchor=\"start\" x=\"41.05\" y=\"-33.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">load</text>\n",
       "<text text-anchor=\"start\" x=\"36.55\" y=\"-5.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">polars</text>\n",
       "</g>\n",
       "<!-- group_by_mean -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>group_by_mean</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M253.45,-275.8C253.45,-275.8 150.85,-275.8 150.85,-275.8 144.85,-275.8 138.85,-269.8 138.85,-263.8 138.85,-263.8 138.85,-224.2 138.85,-224.2 138.85,-218.2 144.85,-212.2 150.85,-212.2 150.85,-212.2 253.45,-212.2 253.45,-212.2 259.45,-212.2 265.45,-218.2 265.45,-224.2 265.45,-224.2 265.45,-263.8 265.45,-263.8 265.45,-269.8 259.45,-275.8 253.45,-275.8\"/>\n",
       "<text text-anchor=\"start\" x=\"149.65\" y=\"-252.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">group_by_mean</text>\n",
       "<text text-anchor=\"start\" x=\"168.02\" y=\"-224.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- series -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>series</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M91.23,-193.8C91.23,-193.8 18.63,-193.8 18.63,-193.8 12.63,-193.8 6.63,-187.8 6.63,-181.8 6.63,-181.8 6.63,-142.2 6.63,-142.2 6.63,-136.2 12.63,-130.2 18.63,-130.2 18.63,-130.2 91.23,-130.2 91.23,-130.2 97.23,-130.2 103.23,-136.2 103.23,-142.2 103.23,-142.2 103.23,-181.8 103.23,-181.8 103.23,-187.8 97.23,-193.8 91.23,-193.8\"/>\n",
       "<text text-anchor=\"start\" x=\"17.43\" y=\"-170.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">series: load</text>\n",
       "<text text-anchor=\"start\" x=\"35.8\" y=\"-142.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">Series</text>\n",
       "</g>\n",
       "<!-- example1 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>example1</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M232.07,-193.8C232.07,-193.8 172.22,-193.8 172.22,-193.8 166.22,-193.8 160.22,-187.8 160.22,-181.8 160.22,-181.8 160.22,-142.2 160.22,-142.2 160.22,-136.2 166.22,-130.2 172.22,-130.2 172.22,-130.2 232.07,-130.2 232.07,-130.2 238.07,-130.2 244.07,-136.2 244.07,-142.2 244.07,-142.2 244.07,-181.8 244.07,-181.8 244.07,-187.8 238.07,-193.8 232.07,-193.8\"/>\n",
       "<text text-anchor=\"start\" x=\"171.02\" y=\"-170.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">example1</text>\n",
       "<text text-anchor=\"start\" x=\"195.02\" y=\"-142.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">int</text>\n",
       "</g>\n",
       "<!-- series&#45;&gt;example1 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>series&#45;&gt;example1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M103.48,-162C117.84,-162 133.69,-162 148.37,-162\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"148.32,-165.5 158.32,-162 148.32,-158.5 148.32,-165.5\"/>\n",
       "</g>\n",
       "<!-- df -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>df</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M87.85,-275.8C87.85,-275.8 22,-275.8 22,-275.8 16,-275.8 10,-269.8 10,-263.8 10,-263.8 10,-224.2 10,-224.2 10,-218.2 16,-212.2 22,-212.2 22,-212.2 87.85,-212.2 87.85,-212.2 93.85,-212.2 99.85,-218.2 99.85,-224.2 99.85,-224.2 99.85,-263.8 99.85,-263.8 99.85,-269.8 93.85,-275.8 87.85,-275.8\"/>\n",
       "<text text-anchor=\"start\" x=\"30.55\" y=\"-252.7\" font-family=\"Helvetica,sans-Serif\" font-weight=\"bold\" font-size=\"14.00\">df: load</text>\n",
       "<text text-anchor=\"start\" x=\"20.8\" y=\"-224.7\" font-family=\"Helvetica,sans-Serif\" font-style=\"italic\" font-size=\"14.00\">DataFrame</text>\n",
       "</g>\n",
       "<!-- df&#45;&gt;group_by_mean -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>df&#45;&gt;group_by_mean</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M100.29,-244C108.89,-244 118.11,-244 127.36,-244\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"127.1,-247.5 137.1,-244 127.1,-240.5 127.1,-247.5\"/>\n",
       "</g>\n",
       "<!-- df&#45;&gt;example1 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>df&#45;&gt;example1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M100.29,-218.95C116.04,-210.06 133.89,-199.98 150.15,-190.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"151.73,-193.93 158.71,-185.96 148.29,-187.83 151.73,-193.93\"/>\n",
       "</g>\n",
       "<!-- _example1_inputs -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>_example1_inputs</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"109.85,-112.3 0,-112.3 0,-67.7 109.85,-67.7 109.85,-112.3\"/>\n",
       "<text text-anchor=\"start\" x=\"14.8\" y=\"-84.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">col_name</text>\n",
       "<text text-anchor=\"start\" x=\"80.05\" y=\"-84.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">str</text>\n",
       "</g>\n",
       "<!-- _example1_inputs&#45;&gt;example1 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>_example1_inputs&#45;&gt;example1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M101.88,-112.78C117.14,-120.35 134.24,-128.83 149.89,-136.58\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"148.05,-139.58 158.57,-140.89 151.16,-133.31 148.05,-139.58\"/>\n",
       "</g>\n",
       "<!-- config -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>config</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" points=\"75.93,-330 27.93,-330 27.93,-294 81.93,-294 81.93,-324 75.93,-330\"/>\n",
       "<polyline fill=\"none\" stroke=\"black\" points=\"75.93,-330 75.93,-324\"/>\n",
       "<polyline fill=\"none\" stroke=\"black\" points=\"81.93,-324 75.93,-324\"/>\n",
       "<text text-anchor=\"middle\" x=\"54.93\" y=\"-306.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">config</text>\n",
       "</g>\n",
       "<!-- input -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>input</title>\n",
       "<polygon fill=\"#ffffff\" stroke=\"black\" stroke-dasharray=\"5,2\" points=\"81.93,-384.3 27.93,-384.3 27.93,-347.7 81.93,-347.7 81.93,-384.3\"/>\n",
       "<text text-anchor=\"middle\" x=\"54.93\" y=\"-360.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">input</text>\n",
       "</g>\n",
       "<!-- function -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>function</title>\n",
       "<path fill=\"#b4d8e4\" stroke=\"black\" d=\"M77.35,-439.3C77.35,-439.3 32.5,-439.3 32.5,-439.3 26.5,-439.3 20.5,-433.3 20.5,-427.3 20.5,-427.3 20.5,-414.7 20.5,-414.7 20.5,-408.7 26.5,-402.7 32.5,-402.7 32.5,-402.7 77.35,-402.7 77.35,-402.7 83.35,-402.7 89.35,-408.7 89.35,-414.7 89.35,-414.7 89.35,-427.3 89.35,-427.3 89.35,-433.3 83.35,-439.3 77.35,-439.3\"/>\n",
       "<text text-anchor=\"middle\" x=\"54.93\" y=\"-415.2\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">function</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.graphs.Digraph at 0x147810cd0>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dr.display_all_functions()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a0c369ea",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
